package com.yuang.redis;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        //App app = (App)context.getBean("app");
        AccountService accountService = (AccountService)context.getBean("accountService");
        System.out.println("==========第一次查询，将走数据库============");
        accountService.getAccountByName("somebody1");
        System.out.println("==========第二次查询，将走缓存，不会进入方法============");
        Account account1 = accountService.getAccountByName("somebody1");

        System.out.println("===========修改数据，将使缓存失效====================");
        account1.setHight(180);
        accountService.updateAcount(account1);
        System.out.println("==============再次读取数据，将走数据库=====================");
        accountService.getAccountByName("somebody1");
        accountService.getAccountByName("somebody2");
        System.out.println("=============强制删除所有缓存器和key====================");
        accountService.reload();
        System.out.println("==============再次读取数据，将走数据库==========================");
        accountService.getAccountByName("somebody1");
        System.out.println("==========查询共享了缓存的方法，将走缓存，不会进入方法============");
        accountService.readAccountName("somebody1");
        System.out.println("===============查询name=abcdefg,长度>4，不会缓存==================");
        accountService.getAccountByCondition("abcdefg");
        System.out.println("===============再次查询name=abcdefg,走数据库==================");
        accountService.getAccountByCondition("abcdefg");
        System.out.println("===============查询name=abcd,长度=4，会缓存==================");
        accountService.getAccountByCondition("abcd");
        System.out.println("===============再次查询name=abcd,走缓存，不会进入方法==================");
        accountService.getAccountByCondition("abcd");
        System.out.println("===============第一次使用id=1,name=somebody3查询，走数据库=============");
        accountService.getAccountByIdAndName(1,"somebody3",true);
        System.out.println("================第二次使用id=1,name=somebody3查询，走缓存，且与第三个参数无关，不会进入方法=======");
        accountService.getAccountByIdAndName(1,"somebody3",false);
        System.out.println("===============更新数据库，同时更新缓存==============");
        account1.setHight(190);
        accountService.updateDBAndCache(account1);
        System.out.println("===============更新后再次查询，将走缓存，不会调用方法====================");
        accountService.getAccountByName("somebody1");

        System.out.println("=============使用beforeInvocation=true使得在方法执行前就清空缓存，保存缓存一定能清空====================");
        try {
            accountService.reloadAnyway();
        } catch (NullPointerException e) {
            System.out.println("------------reloadAnyway()抛出异常，但依然能保证缓存情况----------");
        }
        System.out.println("==============查询somebody1，走数据库==================");
        accountService.getAccountByName("somebody1");
        System.out.println("==============spring cache的限制，内部方法调用不会走缓存，继续走数据库========");
        accountService.getAccountFromInternal("somebody1");
        System.out.println("=============测试结束，清空缓存器account关联的所有缓存=========================");
        accountService.reload();
    }
}
